﻿

#define _CRT_SECURE_NO_WARNINGS
//链表的建立、插入、删除
////////#include <stdio.h>
////////#include <stdlib.h>
////////#include <string.h>
//
//
////结构体的构建
//typedef struct worker
//{
//	char num[15];//工号
//	char name[20];//姓名
//	int age;//年龄
//	struct worker* next;//指针变量用于保存下一个节点的地址
//}Worker;
//int n = 0;
//
//#define LEN sizeof(struct worker)
//
//
////动态链表的创建
//Worker* create()
//{
//	Worker* p1, * p2, * head;
//	char num[15] = { 0 };
//	char name[20] = { 0 };
//	int age = { 0 };
//	head = NULL;
//	p1 = p2 = (Worker*)malloc(LEN);//开创一个空间用于存放结构体内的数据
//	printf("请输入工号、姓名、年龄：（格式：工号 姓名 年龄）\n");
//	scanf("%s %s %d", p1->num, p1->name, &p1->age);
//	while (p1->num != 0)//num=0时，链表创建结束
//	{
//		n++;//工人的人数
//		if (n == 1)
//			head = p1;//把第一个节点的地址赋给head指针
//		else
//			p2->next = p1;//如果输入的不是第一个节点的数据，就让其内的next指针指向下一个结点的开头
//
//		p2 = p1;//p2指针移动到p1指针处（下一个节点的开头）
//		p1 = (Worker*)malloc(LEN);//p1又指向新开创结点的开头
//		scanf("%s %s %d", p1->num, p1->name, &p1->age);
//	}
//	p2->next = NULL;//如果输入的num=0，跳出循环，最后一个结点的next指针指向空指针
//	return head;//返回第一个节点的地址（这样才能找到后面所有的地址）
//}
//
////动态链表的插入
//Worker* insert(Worker* head)
//{
//	Worker* p;
//	printf("请输入需要插入数据的位置：");
//	int m = 0;
//	scanf("%d", &m);
//	p = head;//p与head指向第一个节点的开头
//	int i = 1;//插入位置
//	printf("请输入需要插入的数据：（格式：工号 姓名 年龄）");
//	Worker* j;
//	j = (Worker*)malloc(LEN);
//	scanf("%s %s %d", j->num, j->name, &j->age);
//	if (m == 1)
//	{
//		j->next = head;
//		head = j;
//		return head;
//	}
//	else
//	{
//		while (i < m - 1)
//			//m-1意味着：如果要在第5个位置插入数据，则需要让第4个节点的next指向插入数据的开头
//		{
//			p = p->next;
//			i++;
//		}
//	}
//	j->next = p->next;
//	p->next = j;//p的next指向j的地址
//	return head;//返回第一个结点的地址
//}
//
////动态链表的删除
////void remove(Worker* head)
////{
////	Worker* p1, * p2;
////	printf("请输入需要删除的位置：");
////	int m;
////	scanf("%d", &m);
////	p1 = head;
////	if (m == 1)
////	{
////		p2 = head->next;
////		free(head);//释放内存
////		head = p2;
////		//return head;
////	}
////	else
////	{
////		int i = 1;
////		while (i < m - 1)
////		{
////			p1 = p1->next;
////			i++;
////		}
////		p2 = p1->next;
////		p1->next = p1->next->next;//p1的next指向了需要删除的节点的next指向的节点
////		free(p2);
////		//return head;
////	}
////}
//
////动态链表的打印
//void print(Worker* head)
//{
//	Worker* p;
//	p = head;
//	printf("\n");
//	if (head != NULL)
//	{
//		do
//		{
//			printf("工号：%s 姓名：%s 年龄：%d", p->num, p->name, p->age);
//			p = p->next;
//			n++;
//		} while (p != NULL);
//	}
//	printf("\n现在共有 %d 个工人信息：\n", n);
//}
//
////主函数
//int main()
//{
//	Worker* pointer;
//	pointer = create();//创建动态链表
//	n = 0;//n清0，为了保证之后的函数里，从第一个节点开始遍历
//	print(pointer);
//	pointer = insert(pointer);
//	n = 0;
//	print(pointer);
//	remove(pointer);
//	n = 0;
//	print(pointer);
//	free(pointer);//释放占用的内存
//	system("pause");
//	return 0;
//}












//#include <stdio.h>
//
//char* My_Strncat(char* arr1, const char* arr2, size_t num)
//{
//    char* ret = arr1;
//    while (*arr1 != '\0')
//    {
//        arr1++;
//    }
//    while (num--)
//    {
//        *arr1++ = *arr2++;
//        if (*arr2 == '\0')
//            break;
//    }
//    *arr1 = '\0';
//    return ret;
//}
//
//int main()
//{
//    char arr1[10] = "abc";
//    char arr2[] = "def";
//    My_Strncat(arr1, arr2, 2);
//    printf("%s\n", arr1);
//    return 0;
//}




////#define _CRT_SECURE_NO_WARNINGS 1
//#include <stdio.h>
//#include <stdlib.h>
//
//int cmp(const void* p1, const void* p2)
//{
//    return (*(int*)p1) > (*(int*)p2);
//}
//
//void myqsort(void* p, int s, void* q)
//{
//    char t = 0;
//    for (int i = 0; i < s; i++)
//    {
//        t = *((char*)p + i);
//        *((char*)p + i) = *((char*)q + i);
//        *((char*)q + i) = t;        
//    }
//}
//
//void pao(void* a, int n, int s, int (*cmp)(void*, void*))
//{
//    for (int i = 0; i < n - 1; i++)
//    {
//        for (int j = 0; j < n - i - 1; j++)
//        {
//            if (cmp((char*)a + j * s, (char*)a + (j + 1) * s))
//            {
//                myqsort((char*)a + j * s, s, (char*)a + (j + 1) * s);
//            }
//        }
//    }
//}
//
//
//int main() {
//    int arr[] = { 1, 3, 5, 7, 9, 2, 4, 6, 8, 0 };
//    int num = sizeof(arr) / sizeof(arr[0]);
//    int size = sizeof(arr);
//    int s = sizeof(arr[0]);
//
//    pao(arr, num, s, cmp);
//    for (int i = 0; i < num; i++)
//    {
//        printf("%d ", arr[i]);
//    }
//    return 0;
//}









//#define _CRT_SECURE_NO_WARNINGS 1
//#include <stdio.h>
//#include <limits.h>
//#include <ctype.h>
//
//enum Status
//{
//    OK,//合法
//    NO//异常
//};
//enum Status status = NO;
//int mn_atoi(const char* s)
//{
//    if (s == NULL)
//        return 0;
//    if (*s == '\0')
//        return 0;
//    while (isspace(*s)) //处理空白字符 向后查找
//        s++;
//    int flag = 0;
//    if (*s == '+')
//    {
//        flag = 1;
//        s++;
//    }
//    else if (*s == '-')
//    {
//        flag = -1;
//        s++;
//    }//处理数字字符 1234
//    long long ret = 0;
//    while (isdigit(*s))
//    {
//        ret = ret * 10 + flag * (*s - '0');
//        if (ret<INT_MIN || ret >INT_MAX)//判断是否越界
//        {
//            return 0;
//        }
//        s++;
//    }
//    if (*s == '\0')
//    {
//        status = OK;
//        return (int)ret;
//    }
//    else
//        return (int)ret;
//}
//
//int main()
//{
//    char s[20] = { 0 };
//    gets(s);
//    /*int ret = atoi(s);
//    printf("%d\n", ret);*/
//    int ret2 = mn_atoi(s);
//
//    printf("%d\n", ret2);
//
//    if (status == OK)
//        printf("合法转换:%d", ret2);
//    else
//        printf("不合法转换:%d", ret2);
//    return 0;
//}








//#define _CRT_SECURE_NO_WARNINGS
////链表的建立、插入、删除
//#include <stdio.h>
//#include <stdlib.h>
//#include <string.h>
//#define LEN sizeof(struct worker)
//
////结构体的构建
//typedef struct worker
//{
//	char num[15];//工号
//	char name[20];//姓名
//	int age;//年龄
//	struct worker* next;//指针变量用于保存下一个节点的地址
//}Worker;
//int n = 0;
//
////动态链表的创建
//Worker* create()
//{
//	Worker* p1, * p2, * head;
//	char num[15] = { 0 };
//	char name[20] = { 0 };
//	int age = { 0 };
//	head = NULL;
//	p1 = p2 = (Worker*)malloc(LEN);//开创一个空间用于存放结构体内的数据
//	printf("请输入工号、姓名、年龄：（格式：工号 姓名 年龄）\n");
//
//	scanf("%s %s %d", p1->num, p1->name, &p1->age);
//	scanf("%d", &n);
//
//	for (int i = 1; i <= n; i++)//num=0时，链表创建结束
//	{
//		if (n == 1)
//			head = p1;//把第一个节点的地址赋给head指针
//		else
//			p2->next = p1;//如果输入的不是第一个节点的数据，就让其内的next指针指向下一个结点的开头
//
//		p2 = p1;//p2指针移动到p1指针处（下一个节点的开头）
//		p1 = (Worker*)malloc(LEN);//p1又指向新开创结点的开头
//		scanf("%s %s %d", p1->num, p1->name, &p1->age);
//	}
//	p2->next = NULL;//如果输入的num=0，跳出循环，最后一个结点的next指针指向空指针
//	return head;//返回第一个节点的地址（这样才能找到后面所有的地址）
//}
//
////动态链表的插入
//Worker* insert(Worker* head)
//{
//	Worker* p;
//	printf("请输入需要插入数据的位置：");
//	int m = 0;
//	scanf("%d", &m);
//	p = head;//p与head指向第一个节点的开头
//	int i = 1;//插入位置
//	printf("请输入需要插入的数据：（格式：工号 姓名 年龄）");
//	Worker* j;
//	j = (Worker*)malloc(LEN);
//	scanf("%s %s %d", j->num, j->name, &j->age);
//	if (m == 1)
//	{
//		j->next = head;
//		head = j;
//		return head;
//	}
//	else
//	{
//		while (i < m - 1)
//			//m-1意味着：如果要在第5个位置插入数据，则需要让第4个节点的next指向插入数据的开头
//		{
//			p = p->next;
//			i++;
//		}
//	}
//	j->next = p->next;
//	p->next = j;//p的next指向j的地址
//	return head;//返回第一个结点的地址
//}
//
////动态链表的删除
//Worker* Remove(Worker* head)
//{
//	Worker* p1, * p2;
//	printf("请输入需要删除的位置：");
//	int m;
//	scanf("%d", &m);
//	p1 = head;
//	if (m == 1)
//	{
//		p2 = head->next;
//		free(head);//释放内存
//		head = p2;
//		return head;
//	}
//	else
//	{
//		int i = 1;
//		while (i < m - 1)
//		{
//			p1 = p1->next;
//			i++;
//		}
//		p2 = p1->next;
//		p1->next = p1->next->next;//p1的next指向了需要删除的节点的next指向的节点
//		free(p2);
//		return head;
//	}
//}
//
////动态链表的打印
//void print(Worker* head)
//{
//	Worker* p;
//	p = head;
//	int i = 1;
//	printf("\n");
//	if (head != NULL)
//	{
//		do
//		{
//			printf("工号：%s 姓名：%s 年龄：%d", p->num, p->name, p->age);
//			p = p->next;
//			i++;
//		} while (i <= n);
//	}
//	printf("\n现在共有 %d 个工人信息：\n", n);
//}
//
////主函数
//int main()
//{
//	Worker* pointer;
//	pointer = create();//创建动态链表
//	//n = 0;//n清0，为了保证之后的函数里，从第一个节点开始遍历
//	print(pointer);
//	pointer = insert(pointer);
//	//n = 0;
//	print(pointer);
//	pointer = Remove(pointer);
//	n = 0;
//	print(pointer);
//	free(pointer);//释放占用的内存
//	system("pause");
//	return 0;
//}





//
//#include <stdio.h>
//
//
//int main()
//{
//
//
//	char arr[20] = { 0 };
//
//	scanf("%s", arr);
//
//	char ch = getchar();
//
//	return 0;
//}
//











//#define _CRT_SECURE_NO_WARNINGS
//
////链表的建立、插入、删除
//#include <stdio.h>
//#include <stdlib.h>
//#include <string.h>
//
//#define LEN sizeof(struct worker)
//
////结构体的构建
//typedef struct worker
//{
//	char num[15];//工号
//	char name[20];//姓名
//	int age;//年龄
//	struct worker* next;//指针变量用于保存下一个节点的地址
//}Worker;
//int n = 0;
//
////动态链表的创建
//Worker* create()
//{
//	Worker* p1, * p2, * head;
//	char num[15] = { 0 };
//	char name[20] = { 0 };
//	int age = { 0 };
//	head = NULL;
//	p1 = p2 = (Worker*)malloc(LEN);//开创一个空间用于存放结构体内的数据
//	p1->next = NULL;
//	printf("请输入员工个数:");
//
//	//scanf("%s %s %d", p1->num, p1->name, &p1->age);
//	scanf("%d", &n);
//
//	for (int i = 1; i <= n; i++)//num=0时，链表创建结束
//	{
//		Worker* node = (Worker*)malloc(LEN);//p1又指向新开创结点的开头
//		node->next = NULL;
//		printf("请输入工号，姓名，年龄:");
//		scanf("%s %s %d", node->num, node->name, &node->age);
//		p2->next = node;
//		p2 = p2->next;
//	}
//	//p2->next = NULL;//如果输入的num=0，跳出循环，最后一个结点的next指针指向空指针
//	return p1->next;//返回第一个节点的地址（这样才能找到后面所有的地址）
//}
//
////动态链表的插入
//void insert(Worker** head)
//{
//	Worker* cur,*pre;
//	printf("请输入需要插入数据的位置：");
//	int m = 0;
//	scanf("%d", &m);
//	cur = *head;//p与head指向第一个节点的开头
//	pre = *head;
//	printf("请输入需要插入的数据：（格式：工号 姓名 年龄）");
//	Worker* node;
//	node = (Worker*)malloc(LEN);
//	scanf("%s %s %d", node->num, node->name, &node->age); 
//    
//	m--;
//	while (m--)
//	{
//		pre = cur;
//		cur = cur->next;
//	}
//
//	if (pre == *head)
//	{
//		node->next = (*head);
//		(*head) = node;
//	}
//	else
//	{
//		pre->next = node;
//		node->next = cur;
//	}
//	
//}
//
////动态链表的删除
//void Remove(Worker** head)
//{
//	printf("请输入需要删除的位置：");
//	int m;
//	scanf("%d", &m);
//
//	Worker* pre = NULL, * cur = *head;
//
//	m--;
//	while (m--)
//	{
//		pre = cur;
//		cur = cur->next;
//	}
//
//	if (pre == NULL)
//	{
//		(*head) = cur->next;
//		free(cur);
//	}
//	else
//	{
//		pre->next = cur->next;
//		free(cur);
//	}
//}
//
////动态链表的打印
//void print(Worker* head)
//{
//	int cnt = 0;
//	while (head)
//	{
//		printf("工号：%s 姓名：%s 年龄：%d\n", head->num, head->name, head->age);
//		head = head->next;
//		cnt++;
//	}
//	printf("\n现在共有 %d 个工人信息：\n", cnt);
//}
//
////主函数
//int main()
//{
//	Worker* pointer;
//	pointer = create();//创建动态链表
//	//n = 0;//n清0，为了保证之后的函数里，从第一个节点开始遍历
//	print(pointer);
//	insert(&pointer);
//	//n = 0;
//	print(pointer);
//	Remove(&pointer);
//	n = 0;
//	print(pointer);
//	free(pointer);//释放占用的内存
//	system("pause");
//	return 0;
//}






//int main()
//{
//	int a = 123;
//	char b = a;
//
//	//printf("%d\n", b);
//
//
//	int c = 511;
//	char d = c;
//
//	return 0;
//}




//#include <stdio.h>
//
//int main() {
//    int i = 10640;
//    int sum = 0;
//    int mul = 10;
//
//    while (i / mul != 0)
//    {
//        int a = i / mul;
//        int b = i % mul;
//        sum += a * b;
//        mul *= 10;
//        if (i == sum)
//            printf("%d ", i);
//    }
//
//    return 0;
//}


